// lib/api/auth_api.dart
import 'package:dio/dio.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:io';
import '../models/response.dart';
import '../models/user.dart';
import '../utils/app_constants.dart';
import 'dio_client.dart';

class AuthApi {
  final Dio _dio = DioClient().dio; // 获取 Dio 单例

  /// 用户注册 (保持不变)
  Future<ResponseSuccess<User>> signup({
    required String username,
    required String password,
    required String rePassword,
    required String phone,
  }) async {
    try {
      final response = await _dio.post(
        '/signup', // 注册 API 路径
        data: {
          'username': username,
          'password': password,
          're_password': rePassword,
          'phone': phone,
        },
      );
      return ResponseSuccess.fromJson(response.data, (json) => User.fromJson(json as Map<String, dynamic>));
    } on DioException catch (e) {
      throw e.response?.data['msg'] ?? '注册失败，请稍后再试。';
    } catch (e) {
      throw '注册发生未知错误: $e';
    }
  }

  /// 用户登录
  Future<ResponseSuccess<User>> login({
    required String username,
    required String password,
  }) async {
    try {
      final response = await _dio.post(
        '/login', // 登录 API 路径
        data: {
          'username': username,
          'password': password,
        },
      );

      // 验证最外层的响应结构
      final int? code = response.data['code'];
      final String? msg = response.data['msg'];
      final Map<String, dynamic>? rawData = response.data['data'] as Map<String, dynamic>?;

      if (code == null || msg == null || rawData == null) {
        throw '服务器返回的响应格式不完整或不正确。';
      }

      // 从 rawData 中提取 token 和 user 信息
      final String? token = rawData['token'] as String?;
      final Map<String, dynamic>? userMap = rawData['user'] as Map<String, dynamic>?;

      if (userMap == null) {
        throw '服务器返回的用户数据格式不正确：缺少 "user" 字段。';
      }

      // 将 token 注入到 userMap 中，以便 User.fromJson 可以直接解析
      if (token != null && token.isNotEmpty) {
        userMap['Token'] = token; // 注意这里是 'Token'，对应 User 模型中的 @JsonKey(name: 'Token')
      }

      // 使用 User.fromJson 解析 userMap 来创建 User 对象
      final User user = User.fromJson(userMap);

      // 创建 ResponseSuccess 对象，T 类型为 User
      final ResponseSuccess<User> successResponse = ResponseSuccess(
        code: code,
        msg: msg,
        data: user, // 直接将解析好的 User 对象赋值给 data
      );

      // 登录成功后保存 Token 和用户信息
      if (successResponse.code == 1000 && successResponse.data != null) {
        final prefs = await SharedPreferences.getInstance();

        // 保存 Token
        if (successResponse.data!.token.isNotEmpty) {
          await prefs.setString(AppConstants.tokenKey, successResponse.data!.token);
          print('Token 已保存: ${successResponse.data!.token}');
        } else {
          print('警告：User 模型中的 token 为空或为null。');
        }

        // 保存用户名和头像
        if (successResponse.data!.username.isNotEmpty) {
          await prefs.setString('current_username', successResponse.data!.username);
          print('用户名已保存: ${successResponse.data!.username}');
        } else {
          print('警告：User 模型中的 username 为空或为null。');
        }

        if (successResponse.data!.avatar.isNotEmpty) {
          await prefs.setString('current_user_avatar', successResponse.data!.avatar);
          print('用户头像URL已保存: ${successResponse.data!.avatar}');
        } else {
          print('警告：User 模型中的 avatar 为空或为null。');
        }
      }
      return successResponse;
    } on DioException catch (e) {
      // 捕获 Dio 错误，尝试从响应中获取 msg
      throw e.response?.data['msg'] ?? '登录失败，请检查用户名或密码。';
    } catch (e) {
      // 捕获其他未知错误
      throw '登录发生未知错误: $e';
    }
  }

  /// 用户退出登录（清除 Token 和用户信息）
  Future<void> logout() async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.remove(AppConstants.tokenKey);
    await prefs.remove('current_username'); // 清除保存的用户名
    await prefs.remove('current_user_avatar'); // 清除保存的用户头像URL
    print('Token 和用户信息已清除。');
  }

  /// 上传用户头像
  /// [imagePath] 待上传的本地图片文件路径
  /// 返回上传成功后的图片 URL
  Future<String> uploadAvatar(String imagePath) async {
    try {
      final prefs = await SharedPreferences.getInstance();
      final token = prefs.getString(AppConstants.tokenKey);

      if (token == null || token.isEmpty) {
        throw '未找到用户 Token，请先登录。';
      }

      // 获取文件名，用于 FormData
      String fileName = imagePath.split('/').last;

      FormData formData = FormData.fromMap({
        "image": await MultipartFile.fromFile(imagePath, filename: fileName),
      });

      final response = await _dio.post(
        '/upload/image', // 您的图片上传 API 路径
        data: formData,
        options: Options(
          headers: {
            'authorization': 'Bearer $token', // 添加认证头
            'Content-Type': 'multipart/form-data', // Dio 会自动设置，但明确指出更安全
          },
        ),
      );

      // 假设后端返回的成功响应中包含图片的 URL
      // 根据您的 CURL 示例，可能需要检查响应结构
      if (response.data != null && response.data['code'] == 1000 && response.data['data'] != null) {
        final uploadedImageUrl = response.data['data']['url'] as String?; // 假设 URL 在 data.url 字段
        if (uploadedImageUrl != null && uploadedImageUrl.isNotEmpty) {
          // 上传成功后，更新本地保存的头像 URL
          await prefs.setString('current_user_avatar', uploadedImageUrl);
          print('用户头像上传成功，URL: $uploadedImageUrl');
          return uploadedImageUrl;
        } else {
          throw '上传成功，但未从响应中获取到图片 URL。';
        }
      } else {
        throw response.data['msg'] ?? '图片上传失败。';
      }
    } on DioException catch (e) {
      String errorMessage = '图片上传失败，请稍后再试。';
      if (e.response?.data != null && e.response!.data['msg'] != null) {
        errorMessage = e.response!.data['msg'].toString();
      }
      throw errorMessage;
    } catch (e) {
      throw '图片上传发生未知错误: $e';
    }
  }

}